﻿using DAL.Repositories;
using Datos;
using Entidad;
using Npgsql;
using NpgsqlTypes;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Negocio
{
    public class FacturasProveedor
    {

        public static int FacturaProveedorInsertar(FacturaProveedor fap)
        {

            string procedureName = "sp_facturaproveedor_insertar";

            List<NpgsqlParameter> parametros = new List<NpgsqlParameter>();
            parametros.Add(Datos.DAL.crearParametro("fap_numero", NpgsqlDbType.Text, fap.numero));
            parametros.Add(Datos.DAL.crearParametro("fap_fecha", NpgsqlDbType.Date, fap.fecha));
            parametros.Add(Datos.DAL.crearParametro("fap_fecharecepcion", NpgsqlDbType.Date, fap.fecharecepcion));
            parametros.Add(Datos.DAL.crearParametro("suc_id", NpgsqlDbType.Integer, fap.sucursal_id));
            parametros.Add(Datos.DAL.crearParametro("pro_id", NpgsqlDbType.Integer, fap.proveedor_id));
            parametros.Add(Datos.DAL.crearParametro("fap_remito", NpgsqlDbType.Text, fap.numeroremito));
            parametros.Add(Datos.DAL.crearParametro("est_id", NpgsqlDbType.Integer, fap.activo));
            parametros.Add(Datos.DAL.crearParametro("fap_importe", NpgsqlDbType.Numeric, fap.importe));
            int resultado = Datos.DAL.EjecutarStoreInsert(procedureName, parametros);
            return resultado;

        }

        public static int FacturaProveedorModificar(FacturaProveedor fap)
        {

            string procedureName = "sp_facturaproveedor_modificar";

            List<NpgsqlParameter> parametros = new List<NpgsqlParameter>();
            parametros.Add(Datos.DAL.crearParametro("fap_numero", NpgsqlDbType.Text, fap.numero));
            parametros.Add(Datos.DAL.crearParametro("fap_fecha", NpgsqlDbType.Date, fap.fecha));
            parametros.Add(Datos.DAL.crearParametro("fap_fecharecepcion", NpgsqlDbType.Date, fap.fecharecepcion));
            parametros.Add(Datos.DAL.crearParametro("suc_id", NpgsqlDbType.Integer, fap.sucursal_id));
            parametros.Add(Datos.DAL.crearParametro("pro_id", NpgsqlDbType.Integer, fap.proveedor_id));
            parametros.Add(Datos.DAL.crearParametro("fap_remito", NpgsqlDbType.Text, fap.numeroremito));
            parametros.Add(Datos.DAL.crearParametro("est_id", NpgsqlDbType.Integer, fap.activo));
            parametros.Add(Datos.DAL.crearParametro("fap_importe", NpgsqlDbType.Numeric, fap.importe));
            parametros.Add(Datos.DAL.crearParametro("fap_id", NpgsqlDbType.Integer, fap.id));
            int resultado = Datos.DAL.EjecutarStoreInsert(procedureName, parametros);
            return resultado;

        }


        public static List<FacturaProveedor> GetTodos()
        {
            List<FacturaProveedor> facs = new List<FacturaProveedor>(); 
            DataTable dt = new DataTable();
            string procedureName = "sp_facturaproveedor_gettodo";
            dt = Datos.DAL.EjecutarStoreConsulta(procedureName);
            if (dt.Rows.Count > 0)
            {
                foreach (DataRow dr in dt.Rows)
                {
                    FacturaProveedor facp = new FacturaProveedor();
                    facp.activo = Convert.ToInt32(dr["estid"]);
                    facp.fecha = Convert.ToDateTime(dr["fapfecha"]);
                    facp.fecharecepcion = Convert.ToDateTime(dr["fapfecharecepcion"]);
                    facp.id = Convert.ToInt32(dr["fapid"]);
                    facp.importe = Convert.ToDecimal(dr["fapimporte"]);
                    facp.numero = dr["fapnumero"].ToString();
                    facp.numeroremito = dr["fapremito"].ToString();
                    facp.proveedor_id = Convert.ToInt32(dr["proid"]);
                    //facp.sucursal_id = Convert.ToInt32(dr["sucid"]);
                    facs.Add(facp);

                }
            }
            return facs;
        }

        public static FacturaProveedor GetPorId(int fapid)
        {
            FacturaProveedor fap = new FacturaProveedor();
            string procedureName = "sp_facturaproveedor_gettodoporid";
            DataTable dt = Datos.DAL.EjecutarStoreConParametro(procedureName, "fap_id", fapid);
            if (dt.Rows.Count > 0)
            {
                fap.sucursal_id = Convert.ToInt32(dt.Rows[0]["sucid"]);
                fap.proveedor_id = Convert.ToInt32(dt.Rows[0]["proid"]);
                fap.numeroremito = dt.Rows[0]["fapremito"].ToString();
                fap.numero = dt.Rows[0]["fapnumero"].ToString();
                fap.importe = Convert.ToDecimal(dt.Rows[0]["fapimporte"]);
                fap.id = Convert.ToInt32(dt.Rows[0]["fapid"]);
                fap.fecharecepcion = Convert.ToDateTime(dt.Rows[0]["fapfecharecepcion"]);
                fap.fecha = Convert.ToDateTime(dt.Rows[0]["fapfecha"]);
                fap.activo = Convert.ToInt32(dt.Rows[0]["estid"]);                
            }
            return fap;
        }


        public static FacturaProveedor GetPorNro(string fapnumero)
        {
            FacturaProveedor fac = new FacturaProveedor();
            string procedureName = "sp_facturaproveedor_gettodopornumero";
            DataTable dt = Datos.DAL.EjecutarStoreConParametro(procedureName, "fap_numero", fapnumero);
            if (dt.Rows.Count > 0)
            {
                fac.sucursal_id = Convert.ToInt32(dt.Rows[0]["sucid"]);
                fac.proveedor_id = Convert.ToInt32(dt.Rows[0]["proid"]);
                fac.numeroremito = dt.Rows[0]["fapremito"].ToString();
                fac.numero = dt.Rows[0]["fapnumero"].ToString();
                fac.importe = Convert.ToDecimal(dt.Rows[0]["fapimporte"]);
                fac.id = Convert.ToInt32(dt.Rows[0]["fapid"]);
                fac.fecharecepcion = Convert.ToDateTime(dt.Rows[0]["fapfecharecepcion"]);
                fac.fecha = Convert.ToDateTime(dt.Rows[0]["fapfecha"]);
                fac.activo = Convert.ToInt32(dt.Rows[0]["estid"]);       


            }


            return fac;

        }


        public static int add(FacturaProveedor newEntity)
        {
            IFacturaProveedorRepository _repository = new FacturaProveedorRepository();
            return _repository.add(newEntity);
        }

        public static int AddConRemito(FacturaProveedor newEntity)
        {
            IFacturaProveedorRepository _repository = new FacturaProveedorRepository();
            return _repository.AddConRemito(newEntity);
        }

        public static IList<FacturaProveedor> FindAllNoAutorizadasConProveedor()
        {
            IFacturaProveedorRepository _repository = new FacturaProveedorRepository();
            return _repository.FindAllNoAutorizadasConProveedor();
        }

        public static IList<FacturaProveedor> FindAllConProveedor()
        {
            IFacturaProveedorRepository _repository = new FacturaProveedorRepository();
            return _repository.FindAllConProveedor();
        }


        public static int AutorizarPago(int factura_id, string observacion)
        {
            IFacturaProveedorRepository _repository = new FacturaProveedorRepository();
            return _repository.AutorizarPago(factura_id, observacion);
        }

        public static IList<FacturaProveedor> FindAll()
        {
            IFacturaProveedorRepository _repository = new FacturaProveedorRepository();
            return _repository.FindAll();
        }

        public static FacturaProveedor FindByIdConDetalleProveedor(int id)
        {
            IFacturaProveedorRepository _repository = new FacturaProveedorRepository();
            return _repository.FindByIdConDetalleProveedor(id);
        }

        public static bool EliminarItemDetalle(int id)
        {
            IFacturaProveedorRepository _repository = new FacturaProveedorRepository();
            return _repository.EliminarItemDetalle(id);
        }

        public static IList<FacturaProveedorRemitoProveedor> FindRemitosFactura(int factura_id)
        {
            IFacturaProveedorRepository _repository = new FacturaProveedorRepository();
            return _repository.FindRemitosFactura(factura_id);
        }

        public static bool EliminarRemitoFactura(int remito_id)
        {
            IFacturaProveedorRepository _repository = new FacturaProveedorRepository();
            return _repository.EliminarRemitoFactura(remito_id);
        }

        public static int Modify(FacturaProveedor entity)
        {
            IFacturaProveedorRepository _repository = new FacturaProveedorRepository();
            return _repository.Modify(entity);
        }
    }
}
